DynamoDBの複数テーブルをStepFunctionでS3にExportしてみた
こんにちは、nkhrです。
DynamoDBの複数テーブルをPoint-in-TimeRecovery+EventBridgeのSchedule実行+Step FunctionでS3にExportしてみました。構成イメージは以下の通り。
EventBridgeの設定
EventBridgeでは、Schedule実行を設定し、パラメータとして「DynamoDBのテーブル名、Export先S3バケットとPrefix」のリストを送信します。ターゲットは作成したStepFunctionとします。
任意のパラメータを送信するために、「入力トランスフォーマー」を利用します。
- 入力パス(Schedule実行でEventBridgeで生成されるイベントを定義します。サンプルイベント参考)
{ "account": "$.account", "detail-type": "$.detail-type", "id": "$.id", "region": "$.region", "resources": "$.resources", "source": "$.source", "time": "$.time", "version": "$.version" }
-
入力テンプレート(入力パスに定義した値は<>で参照します)
{ "version": <version>, "id": <id>, "time": <time>, "tablelist": [ { "tablename": "test", "bucketname": "test-logs", "prefix": "exported/test" }, { "tablename": "test2", "bucketname": "test-logs", "prefix": "exported/test2" } ] }
Step Functionの設定
以下のようなStep Functionを作成します。Mapに”$.tablelist”を渡すことで、EventBridgeから渡されたリスト内の値ごとにExport実行と完了判定を行います。
{ "Comment": "A description of my state machine", "StartAt": "Map", "States": { "Map": { "Type": "Map", "Iterator": { "StartAt": "ExportTableToPointInTime", "States": { "ExportTableToPointInTime": { "Type": "Task", "Parameters": { "S3Bucket.$": "$.bucketname", "S3Prefix.$": "$.prefix", "S3SseAlgorithm": "AES256", "ExportFormat": "DYNAMODB_JSON", "TableArn.$": "States.Format('arn:aws:dynamodb:ap-northeast-1:<account-id>:table/{}', $.tablename)" }, "Resource": "arn:aws:states:::aws-sdk:dynamodb:exportTableToPointInTime", "Next": "DescribeExport" }, "DescribeExport": { "Type": "Task", "Parameters": { "ExportArn.$": "$.ExportDescription.ExportArn" }, "Resource": "arn:aws:states:::aws-sdk:dynamodb:describeExport", "Next": "Wait for export" }, "Wait for export": { "Type": "Choice", "Choices": [ { "Variable": "$.ExportDescription.ExportStatus", "StringEquals": "IN_PROGRESS", "Next": "Wait 15s" }, { "Variable": "$.ExportDescription.ExportStatus", "StringEquals": "COMPLETED", "Next": "Success" } ], "Default": "Fail" }, "Fail": { "Type": "Fail" }, "Wait 15s": { "Type": "Wait", "Seconds": 15, "Next": "DescribeExport" }, "Success": { "Type": "Succeed" } } }, "End": true, "ItemsPath": "$.tablelist", "MaxConcurrency": 5 } } }
まとめ
EventBridgeやStepFunctionの仕組みの勉強もかねて、DynamoDBの複数テーブルExportをためしてみました。
今回はEventBridgeの入力トランスフォーマーを利用してExport対象のテーブルリストを管理しましたが、対象テーブルの一覧はParameterStoreとか外部で管理して、Mapの前に一覧を取得するほうが、仕組みとしては管理しやすいと思います。
以上、nkhrでした。